<?php
namespace Swiftx\DataType;
/**
 * ---------------------------------------------------------------------------------------------------------------------
 * 字符串数据类型
 * ---------------------------------------------------------------------------------------------------------------------
 * @author      胡永强 <odaytudio@gmail.com>
 * @since       2015-09-30
 * @copyright   Copyright (c) 2014-2015 Swiftx Inc.
 * ---------------------------------------------------------------------------------------------------------------------
 */
class Page implements \ArrayAccess,\Iterator {

    private $_count = 0;		     // 总记录数
    private $_total = 1;		     // 总页数
    private $_numPer = 1;		     // 每页显示记录数
    private $_current = 1;	         // 当前页码
    private $_data = array();		 // 分页内容载入
    private $_valid = false;       // 迭代器标记

    /**
     * 获取该模型所有实例
     * @param $current  当前页页码
     * @param $count    总记录数
     * @param $numPer   每页显示记录数
     */
    public function __construct($current, $count, $numPer){
        $this->_count = $count;
        $this->_numPer = $numPer;
        $this->_total = floor($this->_count/$this->_numPer);
        if($this->_count%$this->_numPer > 0)
            $this->_total += 1;
        $this->_current = $current;
    }

    /**
     * 页面开始于第几条数据
     * @return mixed
     */
    public function firstNum(){
        return ($this->_current-1)*$this->_numPer;
    }

    /**
     * 读取总记录数
     * @return mixed
     */
    public function getCount(){
        return $this->_count;
    }

    /**
     * 设置总记录数
     * @param $value
     */
    public function setCount($value){
        $this->_count = $value;
    }

    /**
     * 读取总页数
     * @return int
     */
    public function getTotal(){
        return $this->_total;
    }

    /**
     * 读取每页显示记录数
     * @return int
     */
    public function getNumPer(){
        return $this->_numPer;
    }

    /**
     * 读取当前页码
     * @return int
     */
    public function getCurrent(){
        return $this->_current;
    }

    /**
     * 获取当前页面内容
     * @return mixed
     */
    public function getData(){
        return $this->_data;
    }

    /**
     * 设置当前页面内容
     * @param array $value
     */
    public function setData(array $value){
        $this->_data = $value;
    }

    public function appendDate($value){
        $this->_data[] = $value;
    }

    /**
     * 是否是第一页
     * @return bool
     */
    public function isFirst(){
        return ($this->_current==1)?true:false;
    }

    /**
     * 是否是最后一页
     * @return bool
     */
    public function isLast(){
        return ($this->_current==$this->_total)?true:false;
    }

    /**
     * 数组查看一条分页数据
     * @param mixed $offset
     * @return bool
     */
    public function offsetExists($offset){
        return isset($this->_data[$offset]);
    }

    /**
     * 数组模式读取一行数据
     * @param mixed $offset
     * @return mixed
     */
    public function offsetGet($offset){
        return $this->_data[$offset];
    }

    /**
     * 数组模式设置字段的值
     * @param mixed $offset
     * @param mixed $value
     * @return mixed|void
     */
    public function offsetSet($offset, $value){
        return $this->_data[$offset] = $value;
    }

    /**
     * 对象数组模式删除方法,禁用！
     * @param mixed $offset
     */
    public function offsetUnset($offset){
        unset($this->_data[$offset]);
    }

    /**
     * 将迭代器的指针移向第一个元素。类似于数组操作函数reset()
     */
    public function rewind(){
        reset($this->_data);
        $this->_valid = (empty($this->_data))?false:true;
    }

    /**
     * 类似于数组操作函数current()。返回迭代的当前元素
     * @return mixed
     */
    public function current(){
        return current($this->_data);
    }

    /**
     * 返回当前迭代器元素的键名，类似于数组操作函数key()
     * @return mixed
     */
    public function key(){
        return key($this->_data);
    }

    /**
     * 将指针移向迭代器的下一个元素，类似于数组操作函数next()
     */
    public function next(){
        $this->_valid = (next($this->_data)===false)?false:true;
    }

    /**
     * 检测在执行了rewind()或是next()函数之后，当前值是否是一个有效的值
     * @return bool
     */
    public function valid(){
        return $this->_valid;
    }
}